from django.core.files.storage import Storage
from fdfs_client.client import Fdfs_client
from django.conf import settings

class FastDFSStorage(Storage):
    """自定义文件存储系统类"""
    def __init__(self, client_path=None, base_url=None):
        #fastDFS客户端配置文件路径
        self.client_path = client_path or settings.FDFS_CLIENT_CONF
        #storage 服务器ip: 端口
        self.base_url = base_url or settings.FDFS_BASE_URL
        # if client_path:
        #     self.client_path = client_path
        # else:
        #     self.client_path = settings.FDFS_CLIENT_CONF


    def _open(self, name, model='rb'):
        """
        用来打开文件，但是我们自定义文件存储系统的目的是为了实现存储远程的FastDFS服务器 不需要打文件
        :param name:要打开的文件名
        :param model:打开文件的模式
        :return:
        """

        pass

    def _save(self, name, content):
        """
        文件存储时 调用此方法，但是此方法默认是向本地存储，在此方法做实现文件存储到远程的FastDFS服务器
        :param name:要上传的文件名
        :param content:以rb模式打开文件对象，通过content.read() 可以读取到文件的二进制数据
        :return:
        """
        # client = Fdfs_client('meiduo_mall/utils/fastdfs/client.conf')
        # client = Fdfs_client(settings.FDFS_CLIENT_CONF)
        client = Fdfs_client(self.client_path)
        ret = client.upload_by_buffer(content.read())
        if ret.get('Status') != 'Upload successed.':
            raise Exception('Upload file failed')

        file_id = ret.get('Remote file_id')

        return file_id

    def exists(self, name):
        """
        当要进行上传时都调用此方法判断文件是否已上传，如果没有上传才会调用save方法进行上传
        :param name:
        :return:
        """
        return False

    def url(self, name):
        """
        当要访问图片时 调用此方法 获取图片文件的绝对路径
        :param name:要访问图片的file_id
        :return:完整的图片访问路径 ：storage IP:8888 + file_id
        """
        # return 'http://192.168.1.210:8888/' + name
        # return settings.FDFS_BASE_URL + name
        return self.base_url + name